In [1]:
import TraceDisplay
from TraceDisplay import BOKEH_RENDERER
from IPython.display import HTML, display
import pandas as pd
pd.set_option('max_colwidth', 999)
In [2]:
image_path = ! find ${WALK_PATH:-.} -name '*.i.h5'
data_path = image_path[0]
html_path = '/dev/null'
data_path
Out[2]:
'/github/workspace/artifacts/small-sched-trace.i.h5'
In [3]:
image = TraceDisplay.Image()
image.load(data_path)
In [4]:
bkr = TraceDisplay.BokehRenderer()
bkr.show()
In [5]:
bkr.render(image)
In [6]:
# Create a snapshot before calling filter
# bkr.image
display(bkr)
display(image.filter)
display(image['/sched_switch'])
Bokeh Plot
filter
/sched_switch
/sched_process_exec
/sched_waking
/sched_wakeup
/sched_process_exit
/sched_stat_runtime
/sched_migrate_task
common_comm common_flags common_pid common_preempt_count cpu event next_comm next_pid next_prio prev_comm prev_pid prev_prio prev_state nxts_cpu line0_category
timestamp
59204455363 echo 1 5406 0 1 sched_switch migration/1 15 0 trace-cmd 5406 120 R+ 59204495554 0
59204495554 migration/1 1 15 0 1 sched_switch swapper/1 0 120 migration/1 15 0 S 59204784523 0
59204544067 <idle> 1 0 0 0 sched_switch trace-cmd 5406 120 swapper/0 0 120 R 59205491491 0
59204784523 <idle> 1 0 0 1 sched_switch dotnet 2626 120 swapper/1 0 120 R 59204869032 0
59204869032 dotnet 1 2626 0 1 sched_switch swapper/1 0 120 dotnet 2626 120 S 59205393398 0
59205393398 <idle> 1 0 0 1 sched_switch Runner.Worker 2638 120 swapper/1 0 120 R 59205499351 0
59205491491 echo 1 5406 0 0 sched_switch trace-cmd 5402 120 echo 5406 120 Z 59205491491 0
59205499351 Runner.Worker 1 2638 0 1 sched_switch Runner.Worker 3262 120 Runner.Worker 2638 120 R 59205499351 0
In [7]:
pid = image['/sched_process_exec'].iloc[0]['common_pid']
display(pid)
image.filter.update({
    k:f"common_pid == {pid}"
    for k in image
})
5406
In [8]:
# Simulate Button click
bkr.update()
# Create a snapshot after calling filter
# bkr.image
display(bkr)
display(image.filter)
display(image['/sched_switch'])
Bokeh Plot
filter
/sched_switch common_pid == 5406
/sched_process_exec common_pid == 5406
/sched_waking common_pid == 5406
/sched_wakeup common_pid == 5406
/sched_process_exit common_pid == 5406
/sched_stat_runtime common_pid == 5406
/sched_migrate_task common_pid == 5406
common_comm common_flags common_pid common_preempt_count cpu event next_comm next_pid next_prio prev_comm prev_pid prev_prio prev_state nxts_cpu line0_category
timestamp
59204455363 echo 1 5406 0 1 sched_switch migration/1 15 0 trace-cmd 5406 120 R+ 59204495554 0
59205491491 echo 1 5406 0 0 sched_switch trace-cmd 5402 120 echo 5406 120 Z 59205491491 0
In [9]:
# Append custom categories

image.category.append(
    label=f'pid == {pid}',
    color='#FF0000',
    field='line0_category',
    query = {
        k:f"common_pid == {pid}"
        for k in image
    },
)

image.category.append(
    label=f'pid != {pid}',
    color='#00FF00',
    field='line0_category',
    query = {
        k:f"common_pid != {pid}"
        for k in image
    },
)

nbcat = len(image.category)

image.filter.clear()
bkr.update()
display(bkr)
image.category
Bokeh Plot
Out[9]:
active color field label query
0 True #660066 line0_category /sched_switch {"/sched_switch": ""}
1 True #006633 line0_category /sched_process_exec {"/sched_process_exec": ""}
2 True #FFCC00 line0_category /sched_waking {"/sched_waking": ""}
3 True #CC3333 line0_category /sched_wakeup {"/sched_wakeup": ""}
4 True #996633 line0_category /sched_process_exit {"/sched_process_exit": ""}
5 True #000099 line0_category /sched_stat_runtime {"/sched_stat_runtime": ""}
6 True #000000 line0_category /sched_migrate_task {"/sched_migrate_task": ""}
7 True #FF0000 line0_category pid == 5406 {"/sched_migrate_task": "common_pid == 5406", "/sched_process_exec": "common_pid == 5406", "/sched_process_exit": "common_pid == 5406", "/sched_stat_runtime": "common_pid == 5406", "/sched_switch": "common_pid == 5406", "/sched_wakeup": "common_pid == 5406", "/sched_waking": "common_pid == 5406"}
8 True #00FF00 line0_category pid != 5406 {"/sched_migrate_task": "common_pid != 5406", "/sched_process_exec": "common_pid != 5406", "/sched_process_exit": "common_pid != 5406", "/sched_stat_runtime": "common_pid != 5406", "/sched_switch": "common_pid != 5406", "/sched_wakeup": "common_pid != 5406", "/sched_waking": "common_pid != 5406"}
In [10]:
# Create two custom shapes
# Example: Task migration (as vertical lines between cpu) and Task running (as horizontal lines on cpu)
#

import numpy as np
display(image['/sched_migrate_task'])

image.shape.append({
    'shape_class' : 'LineShape',
    'shape_field' : {
        '/sched_migrate_task':{
            'x0':'timestamp',
            'y0':'orig_cpu',
            'x1':'timestamp',
            'y1':'dest_cpu',
            'category':'line1_category',
        },
        '/sched_switch':{
            'x0':'timestamp',
            'y0':'cpu',
            'x1':'nxts_cpu',
            'y1':'cpu',
            'category':'line1_category',
        },
    }
})


# Before drawing we need to set some categories
# Let's create per_pid categories with random colors
import random
r = lambda: random.randint(0,255)
random_color = lambda : '#%02X%02X%02X' % (r(),r(),r())
PID = np.unique(np.concatenate(([
    np.unique(image['/sched_migrate_task']['pid']),
    np.unique(image['/sched_switch']['next_pid']),
])))
for pid in PID:
    image.category.append(
        label=f'pid[{pid}]',
        color=random_color(),
        field='line1_category',
        query={
            '/sched_migrate_task':f'pid=={pid}',
            '/sched_switch':f'next_pid=={pid}'
        },
    )

# Disable the two previous categories 
image.category.loc[[nbcat-2,nbcat-1],['active']] = False

# Disable previous shape
nbshape = len(image.shape)
image.shape.loc[0:nbshape-2,['active']] = False

# Draw
bkr.update()
display(bkr)
display(image.category)
display(image.shape)
comm common_comm common_flags common_pid common_preempt_count cpu dest_cpu event orig_cpu pid prio line0_category
timestamp
59204460999 trace-cmd migration/1 1 15 1 1 0 sched_migrate_task 1 5406 120 8
59205479680 Runner.Worker Runner.Worker 1 2638 0 1 1 sched_migrate_task 0 3262 120 8
59205517659 Runner.Worker Runner.Worker 1 3262 0 1 1 sched_migrate_task 0 4809 120 8
Bokeh Plot
active color field label query
0 True #660066 line0_category /sched_switch {"/sched_switch": ""}
1 True #006633 line0_category /sched_process_exec {"/sched_process_exec": ""}
2 True #FFCC00 line0_category /sched_waking {"/sched_waking": ""}
3 True #CC3333 line0_category /sched_wakeup {"/sched_wakeup": ""}
4 True #996633 line0_category /sched_process_exit {"/sched_process_exit": ""}
5 True #000099 line0_category /sched_stat_runtime {"/sched_stat_runtime": ""}
6 True #000000 line0_category /sched_migrate_task {"/sched_migrate_task": ""}
7 False #FF0000 line0_category pid == 5406 {"/sched_migrate_task": "common_pid == 5406", "/sched_process_exec": "common_pid == 5406", "/sched_process_exit": "common_pid == 5406", "/sched_stat_runtime": "common_pid == 5406", "/sched_switch": "common_pid == 5406", "/sched_wakeup": "common_pid == 5406", "/sched_waking": "common_pid == 5406"}
8 False #00FF00 line0_category pid != 5406 {"/sched_migrate_task": "common_pid != 5406", "/sched_process_exec": "common_pid != 5406", "/sched_process_exit": "common_pid != 5406", "/sched_stat_runtime": "common_pid != 5406", "/sched_switch": "common_pid != 5406", "/sched_wakeup": "common_pid != 5406", "/sched_waking": "common_pid != 5406"}
9 True #EEEBC6 line1_category pid[0] {"/sched_migrate_task": "pid==0", "/sched_switch": "next_pid==0"}
10 True #210915 line1_category pid[15] {"/sched_migrate_task": "pid==15", "/sched_switch": "next_pid==15"}
11 True #9C0628 line1_category pid[2626] {"/sched_migrate_task": "pid==2626", "/sched_switch": "next_pid==2626"}
12 True #EC41A7 line1_category pid[2638] {"/sched_migrate_task": "pid==2638", "/sched_switch": "next_pid==2638"}
13 True #221091 line1_category pid[3262] {"/sched_migrate_task": "pid==3262", "/sched_switch": "next_pid==3262"}
14 True #C8EA26 line1_category pid[4809] {"/sched_migrate_task": "pid==4809", "/sched_switch": "next_pid==4809"}
15 True #CD1BA6 line1_category pid[5402] {"/sched_migrate_task": "pid==5402", "/sched_switch": "next_pid==5402"}
16 True #EC2592 line1_category pid[5406] {"/sched_migrate_task": "pid==5406", "/sched_switch": "next_pid==5406"}
active shape_class shape_field
0 False LineShape {"/sched_switch": {"x0": "timestamp", "y0": "cpu", "x1": "timestamp", "y1": "cpu + 0.5", "category": "line0_category"}}
1 False LineShape {"/sched_process_exec": {"x0": "timestamp", "y0": "cpu", "x1": "timestamp", "y1": "cpu + 0.5", "category": "line0_category"}}
2 False LineShape {"/sched_waking": {"x0": "timestamp", "y0": "cpu", "x1": "timestamp", "y1": "cpu + 0.5", "category": "line0_category"}}
3 False LineShape {"/sched_wakeup": {"x0": "timestamp", "y0": "cpu", "x1": "timestamp", "y1": "cpu + 0.5", "category": "line0_category"}}
4 False LineShape {"/sched_process_exit": {"x0": "timestamp", "y0": "cpu", "x1": "timestamp", "y1": "cpu + 0.5", "category": "line0_category"}}
5 False LineShape {"/sched_stat_runtime": {"x0": "timestamp", "y0": "cpu", "x1": "timestamp", "y1": "cpu + 0.5", "category": "line0_category"}}
6 False LineShape {"/sched_migrate_task": {"x0": "timestamp", "y0": "cpu", "x1": "timestamp", "y1": "cpu + 0.5", "category": "line0_category"}}
7 True LineShape {"/sched_migrate_task": {"x0": "timestamp", "y0": "orig_cpu", "x1": "timestamp", "y1": "dest_cpu", "category": "line1_category"}, "/sched_switch": {"x0": "timestamp", "y0": "cpu", "x1": "nxts_cpu", "y1": "cpu", "category": "line1_category"}}
In [ ]: